﻿/*****************************************************
**Copyright(C), 2021-2022, Ciqtek Technology.
**Version:     1.0
**Author:      hujr
**Date:        2021/12/01
**Description: SnapImgItem 抓图显示区域Item项
*****************************************************/

#ifndef SNAPIMGITEM_H
#define SNAPIMGITEM_H

#include "../../ofuidll_global.h"

#include "SnapImgDef.h"
#include <QWidget>
#include <QLabel>
#include <QVariant>

namespace OfUI {

	class OFUIDLL_EXPORT SnapImgItem : public QWidget
	{
		Q_OBJECT

	public:
		explicit SnapImgItem(QWidget *parent = Q_NULLPTR);
		~SnapImgItem();

	public:
		/**
		 * @brief  initForm 窗口初始化
		 * @return void
		 */
		void initForm();

		/**
		 * @brief  setData 设置Item数据
		 * @param  &
		 * @param  bRefresh 是否刷新数据
		 * @return void
		 */
		void setData(const SnapData&, bool bRefresh = true);

		/**
		 * @brief  getData 获取Item数据
		 * @return SnapData
		 */
		SnapData getData();

		/**
		 * @brief  setSelect 设置Item是否选中
		 * @param
		 * @return void
		 */
		void setSelect(bool);

		/**
		 * @brief  isSelected 判断Item是否选中
		 * @return bool
		 */
		bool isSelected() const;

		/**
		 * @brief  setItemShowBottom 设置Item 是否显示底部区域
		 * @param
		 * @return void
		 */
		void setItemShowBottom(bool);

		/**
		 * @brief  setZoom 设置Item缩放比例
		 * @param  fRatio
		 * @return void
		 */
		void setZoom(float fRatio);

		/**
		 * @brief  setGroupIndex 设置所在GroupImgView的索引
		 * @param
		 * @return void
		 */
		void setGroupIndex(int);

		/**
		 * @brief  setRowIndex 设置所在GroupImgView的行
		 * @param
		 * @return void
		 */
		void setRowIndex(int);

		/**
		 * @brief  setColIndex 设置所在GroupImgView的列
		 * @param
		 * @return void
		 */
		void setColIndex(int);

		/**
		 * @brief  getSnapViewImgPointer 获取最外层SnapImgView窗口指针
		 * @return QWidget*
		 */
		QWidget* getSnapViewImgPointer();

		/**
		 * @brief  setSnapImgViewPointer 设置最外层SnapImgView窗口指针
		 * @param  *
		 * @return void
		 */
		void setSnapImgViewPointer(QWidget*);

	Q_SIGNALS:
		/**
		 * @brief  signalItemSelectChanged  Item选中状态变化信号
		 * @param  data						Item 数据
		 * @param  bSelect					选中状态
		 * @param  bSingle					单选模式
		 * @return void
		 */
		void signalItemSelectChanged(const SnapData& data, bool bSelect, bool bSingle);

		/**
		 * @brief  signalItemContextMenu    Item右键菜单信号
		 * @param  data						Item 数据
		 * @param  globalPos				鼠标点击时的全局位置
		 * @return void
		 */
		void signalItemContextMenu(const SnapData& data, QPoint globalPos);

		/**
		 * @brief  signalItemCustomMsg	Item自定义信号，用于派生类使用
		 * @param  data					Item 数据
		 * @param  msg					自定义消息
		 * @return void
		 */
		void signalItemCustomMsg(const SnapData& data, const QVariant& msg);

	protected:
		/**
		 * @brief  resizeEvent 窗口大小调整
		 * @param  event
		 * @return void
		 */
		void resizeEvent(QResizeEvent *event) override;

		/**
		 * @brief  mousePressEvent
		 * @param  event
		 * @return void
		 */
		void mousePressEvent(QMouseEvent *event) override;

		/**
		 * @brief  contextMenuEvent
		 * @param  event
		 * @return void
		 */
		void contextMenuEvent(QContextMenuEvent *event) override;

	protected:
		/**
		 * @brief  initImgWidget	初始化图片窗口，必须设置一个固定宽高作为基础大小
		 * @return QWidget*
		 */
		virtual QWidget* initImgWidget();

		/**
		 * @brief  initPathWidget 初始化路径窗口
		 * @return QWidget*
		 */
		virtual QWidget* initPathWidget();

		/**
		 * @brief  refreshData 刷新界面数据
		 * @return void
		 */
		virtual void refreshData();

		/**
		 * @brief  refreshStyle 刷新界面样式
		 * @return void
		 */
		virtual void refreshStyle();

	private:
		/** 最外层视图指针
		 */
		QWidget* m_pSnapImgViewPointer;

		/** 图片显示窗口
		 */
		QWidget* m_pImgWidget;

		/** 路径显示Label
		 */
		QWidget* m_pPathWidget;

	private:
		/** 初始化标志
		 */
		bool m_bInit;

		/** Item数据
		 */
		SnapData m_stData;

		/** 是否选中
		 */
		bool m_bSelect;

		/** 是否显示底部信息
		 */
		bool m_bItemShowBottom;

		/** 顶部窗口正常大小
		 */
		QSize m_stNormalTopSize;

		/** 底部窗口高度 (宽度保持与Top一致)
		 */
		int m_nBottomHeight;

		/** 顶部窗口放大倍数
		 */
		bool m_bTopWidgetZoom;

		/** 底部窗口放大倍数
		 */
		bool m_bBottomWidgetZoom;

		/** Item所在组的索引
		 */
		int m_nGroupIndex;

		/** 所在组的行
		 */
		int m_nRowIndex;

		/** 所在组的列
		 */
		int m_nColIndex;
	};

}

#endif // SNAPIMGITEM_H
